<?php

// PHP雪里开轻量级报修系统 V1.0Beta
// 演示地址: http://baoxiu.chalide.cn
// 更新关注: /weivote
// 文件路径: inc/pubs.php
// 文件大小: 8033 字节
// 最后修改时间: 2025-05-21 14:48:34
// 作者: yujianyue
// 邮件: 15058593138@qq.com
// 版权所有,保留发行权和署名权

/**
 * 本文件功能：公共函数库
 * 版权声明：保留发行权和署名权
 * 作者信息：功能反馈:15058593138@qq.com(手机号同微信)
 */

// 安全过滤函数
function safe_string($str) {
    return htmlspecialchars(trim($str), ENT_QUOTES, 'UTF-8');
}

function safe_int($int) {
    return intval($int);
}

function safe_float($float) {
    return floatval($float);
}

function safe_sql($str, $mysqli) {
    return $mysqli->real_escape_string($str);
}

// JSON提示函数
function json_msg($status, $msg, $data = []) {
    $result = ['status' => $status, 'msg' => $msg];
    if (!empty($data)) {
        $result['data'] = $data;
    }
    return json_encode($result, JSON_UNESCAPED_UNICODE);
}

// 成功返回
function json_success($msg = '操作成功', $data = []) {
    echo json_msg('success', $msg, $data);
    exit;
}

// 失败返回
function json_error($msg = '操作失败', $data = []) {
    echo json_msg('error', $msg, $data);
    exit;
}

// 检查登录状态
function check_login($type = '') {
    session_start();
    if (!isset($_SESSION['user_id']) || empty($_SESSION['user_id'])) {
        header('Location: index.php');
        exit;
    }
    
    if (!empty($type) && $_SESSION['user_type'] !== $type) {
        header('Location: index.php?msg=' . urlencode('无权访问'));
        exit;
    }
    
    return $_SESSION;
}

// CSV数据导入函数
function import_csv_data($file, $callback) {
    $result = ['success' => 0, 'error' => 0, 'errors' => []];
    
    if (($handle = fopen($file, "r")) !== FALSE) {
        // 读取首行作为标题
        $headers = fgetcsv($handle, 1000, ",");
        
        // 转换标题为小写并去除空格
        foreach ($headers as &$header) {
            $header = strtolower(trim($header));
        }
        
        // 逐行读取数据
        $row_num = 1;
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            $row_num++;
            
            // 如果数据列数少于标题列数，跳过
            if (count($data) < count($headers)) {
                $result['error']++;
                $result['errors'][] = "第 {$row_num} 行数据列数不足";
                continue;
            }
            
            // 组合为关联数组
            $row = [];
            for ($i = 0; $i < count($headers); $i++) {
                if (isset($data[$i])) {
                    $row[$headers[$i]] = $data[$i];
                } else {
                    $row[$headers[$i]] = '';
                }
            }
            
            // 调用回调函数处理数据
            $status = $callback($row, $row_num);
            if ($status === true) {
                $result['success']++;
            } else {
                $result['error']++;
                $result['errors'][] = "第 {$row_num} 行: " . $status;
            }
        }
        fclose($handle);
    } else {
        $result['error'] = 1;
        $result['errors'][] = "无法打开文件";
    }
    
    return $result;
}

// 生成分页HTML
function pagination($page, $total_pages, $url) {
    $html = '<div class="pagination">';
    
    // 首页和上一页
    if ($page > 1) {
        $html .= '<a href="javascript:void(0)" onclick="goPage(1, \''.$url.'\')" class="page-item">首页</a>';
        $html .= '<a href="javascript:void(0)" onclick="goPage('.($page-1).', \''.$url.'\')" class="page-item">上一页</a>';
    } else {
        $html .= '<span class="page-item disabled">首页</span>';
        $html .= '<span class="page-item disabled">上一页</span>';
    }
    
    // 页码下拉选择框
    $html .= '<select class="page-select" onchange="goPage(this.value, \''.$url.'\')">';
    for ($i = 1; $i <= $total_pages; $i++) {
        $selected = ($i == $page) ? 'selected' : '';
        $html .= '<option value="'.$i.'" '.$selected.'>'.$i.'</option>';
    }
    $html .= '</select>';
    
    // 下一页和末页
    if ($page < $total_pages) {
        $html .= '<a href="javascript:void(0)" onclick="goPage('.($page+1).', \''.$url.'\')" class="page-item">下一页</a>';
        $html .= '<a href="javascript:void(0)" onclick="goPage('.$total_pages.', \''.$url.'\')" class="page-item">末页</a>';
    } else {
        $html .= '<span class="page-item disabled">下一页</span>';
        $html .= '<span class="page-item disabled">末页</span>';
    }
    
    $html .= '</div>';
    return $html;
}

// 上传图片处理
function process_uploaded_images($files, $max_count = 5) {
    $uploaded = [];
    $errors = [];
    $max_size = MAX_UPLOAD_SIZE * 1024 * 1024; // 转换为字节
    
    // 创建日期目录
    $dir = 'Img/' . date('Y/m/d');
    if (!is_dir($dir) && !mkdir($dir, 0755, true)) {
        return ['error' => true, 'msg' => '无法创建目录: ' . $dir];
    }
    
    // 处理上传的图片
    $count = 0;
    for ($i = 0; $i < count($files['name']); $i++) {
        if ($files['error'][$i] !== UPLOAD_ERR_OK) {
            continue;
        }
        
        if ($count >= $max_count) {
            $errors[] = '超过最大图片数量限制';
            break;
        }
        
        $tmp_name = $files['tmp_name'][$i];
        $name = $files['name'][$i];
        $size = $files['size'][$i];
        $type = $files['type'][$i];
        
        // 检查文件大小
        if ($size > $max_size) {
            $errors[] = "文件 {$name} 超过最大上传大小";
            continue;
        }
        
        // 检查是否为图片
        $allowed_types = ['image/jpeg', 'image/png', 'image/gif'];
        if (!in_array($type, $allowed_types)) {
            $errors[] = "文件 {$name} 不是允许的图片类型";
            continue;
        }
        
        // 生成新文件名
        $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
        $new_name = date('YmdHis') . sprintf('%08d', mt_rand(1, 99999999)) . '.' . $ext;
        $path = $dir . '/' . $new_name;
        
        // 移动文件
        if (move_uploaded_file($tmp_name, $path)) {
            $uploaded[] = $path;
            $count++;
        } else {
            $errors[] = "无法保存文件 {$name}";
        }
    }
    
    return [
        'error' => !empty($errors),
        'msg' => !empty($errors) ? implode('; ', $errors) : '上传成功',
        'uploaded' => $uploaded
    ];
}

// 获取用户名
function get_user_name($user_id, $mysqli) {
    $user_id = intval($user_id);
    $sql = "SELECT realname FROM " . DB_PREFIX . "stux WHERE id = {$user_id}";
    $result = $mysqli->query($sql);
    
    if ($result && $result->num_rows > 0) {
        $row = $result->fetch_assoc();
        return $row['realname'];
    }
    
    return '未知用户';
}

// 格式化日期
function format_date($date) {
    if (empty($date)) return '';
    return date('Y-m-d H:i', strtotime($date));
}

// 显示状态标签
function status_label($status) {
    $labels = [
        '未处理' => '<span class="status-wait">未处理</span>',
        '处理中' => '<span class="status-progress">处理中</span>',
        '已完成' => '<span class="status-done">已完成</span>',
        '已关闭' => '<span class="status-closed">已关闭</span>'
    ];
    
    return isset($labels[$status]) ? $labels[$status] : $status;
}

// 输出JSON给JS调用的配置文件
function generate_json_config() {
    global $mysqli;
    
    $config = [
        'site_name' => '简易报修系统',
        'upload_size' => MAX_UPLOAD_SIZE,
        'version' => SYSTEM_VERSION
    ];
    
    // 从数据库读取设置
    $sql = "SELECT * FROM " . DB_PREFIX . "site";
    $result = $mysqli->query($sql);
    
    if ($result && $result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            $config[$row['key']] = $row['value'];
        }
    }
    
    // 写入json.php文件
    $json = json_encode($config, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    file_put_contents('inc/json.php', $json);
    
    return $config;
}
